﻿using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CubaLibreBar.Model.Core.Entities;
using System.Data.SqlClient;
using System.Data.SqlServerCe;
using CubaLibreBar.Model.Dados;
using CubaLibreBar.Model.Entidades;
using System.Data;

namespace CubaLibreBar.Model.Dados
{
    public static class VendasDAO
    {
        /// <summary>
        /// Pega uma lista de todos os Vendas gravados no banco de dados
        /// </summary>
        /// <returns></returns>
        public static List<Vendas> GetAllVendas()
        {
            List<Vendas> Vendas = new List<Vendas>();

            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = @"SELECT * FROM tbVendas";
                        SqlCeDataReader reader = cmd.ExecuteReader();

                        while (reader.Read())
                        {
                            Vendas venda = new Vendas();
                            venda.IdVenda = Convert.ToInt64(reader["IdVenda"]);
                            venda.DataVenda = Convert.ToDateTime(reader["DataVenda"]);
                            venda.ValorVenda = Convert.ToDecimal(reader["ValorVenda"]);

                            Vendas.Add(venda);
                        }

                        reader.Close();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }

            return Vendas;
        }

        /// <summary>
        // Grava uma entidade Vendas no banco de dados
        /// </summary>
        /// <param name="venda"></param>
        public static int CreateVenda(Vendas venda, SqlCeConnection connection)
        {
            int idVenda;

            using (SqlCeCommand cmd = connection.CreateCommand())
            {
                cmd.CommandText =
                    "INSERT INTO tbVendas(DataVenda, ValorVenda, QuantidadeVenda) VALUES (@DataVenda, @ValorVenda, @QuantidadeVenda)";
                cmd.Parameters.Add(new SqlCeParameter("@DataVenda", venda.DataVenda));
                cmd.Parameters.Add(new SqlCeParameter("@ValorVenda", venda.ValorVenda));
                cmd.Parameters.Add(new SqlCeParameter("@QuantidadeVenda", venda.QuantidadeVenda));
                cmd.ExecuteNonQuery();

                cmd.Parameters.Clear();
                cmd.CommandText = "SELECT @@IDENTITY";
                idVenda = Convert.ToInt32(cmd.ExecuteScalar());

                cmd.Dispose();
            }

            return idVenda;
        }

        /// <summary>
        // Grava uma entidade Vendas no banco de dados
        /// </summary>
        /// <param name="venda"></param>
        public static void CreateVendaProduto(VendaProduto venda, SqlCeConnection connection)
        {
            using (SqlCeCommand cmd = connection.CreateCommand())
            {
                cmd.CommandText =
                    "INSERT INTO tbVendasProdutos(IdVenda, IdProduto, QuantidadeProduto) VALUES (@IdVenda, @IdProduto, @QuantidadeProduto)";
                cmd.Parameters.Add(new SqlCeParameter("@IdVenda", venda.IdVenda));
                cmd.Parameters.Add(new SqlCeParameter("@IdProduto", venda.IdProduto));
                cmd.Parameters.Add(new SqlCeParameter("@QuantidadeProduto", venda.QuantidadeProduto));

                cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// Consulta uma Venda no Banco de Dados por IdVenda
        /// </summary>
        /// <param name="idvenda"></param>
        /// <returns></returns>
        public static Vendas GetById(int idVenda)
        {
            Vendas venda = new Vendas();

            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = @"SELECT * FROM tbVendas WHERE IdVenda = @IdVenda";
                        cmd.Parameters.Add(new SqlCeParameter("@IdVenda", idVenda));

                        SqlCeDataReader reader = cmd.ExecuteReader();

                        while (reader.Read())
                        {
                            venda.IdVenda = Convert.ToInt64(reader["IdVenda"]);
                            venda.DataVenda = Convert.ToDateTime(reader["DataVenda"]);
                            venda.ValorVenda = Convert.ToDecimal(reader["ValorVenda"]);
                        }

                        reader.Close();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }

            return venda;
        }
        
        /// <summary>
        /// Atualiza um venda no banco de dados
        /// </summary>
        /// <param name="venda"></param>
        public static void UpdateVenda(Vendas venda)
        {
            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText =
                            @"UPDATE tbVendas SET 
                              (DataVenda = @DataVenda, 
                              ValorVenda = @ValorVenda,
                              QuantidadeVenda = @QuantidadeVenda)
                              WHERE IdVenda = @IdVenda";
                        cmd.Parameters.Add(new SqlCeParameter("@DataVenda", venda.DataVenda));
                        cmd.Parameters.Add(new SqlCeParameter("@ValorVenda", venda.ValorVenda));
                        cmd.Parameters.Add(new SqlCeParameter("@QuantidadeVenda", venda.QuantidadeVenda));
                        cmd.Parameters.Add(new SqlCeParameter("@IdVenda", venda.IdVenda));

                        cmd.ExecuteNonQuery();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// Deleta um venda no banco de dados
        /// </summary>
        /// <param name="idvenda"></param>
        public static void DeleteVenda(int idVenda)
        {
            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = @"DELETE tbVendas WHERE IdVenda = @IdVenda";
                        cmd.Parameters.Add(new SqlCeParameter("@IdVenda", idVenda));

                        cmd.ExecuteNonQuery();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public static void FecharPedido(Vendas venda, List<ProdutosDto> produtos)
        {
            SqlCeConnection connection = ConnectionFactory.GetConnection();
            connection.Open();
            SqlCeTransaction transaction = connection.BeginTransaction();

            try
            {
                int idVenda = CreateVenda(venda, connection);

                foreach (var produto in produtos)
                {
                    VendaProduto vendaProd = new VendaProduto();

                    vendaProd.IdProduto = produto.IdProduto;
                    vendaProd.IdVenda = idVenda;
                    vendaProd.QuantidadeProduto = produto.QuantidadeProduto;

                    Produtos temp = ProdutosDAO.GetById(produto.IdProduto);
                    int quantidade = temp.QuantidadeProduto - produto.QuantidadeProduto;

                    ProdutosDAO.UpdateQuantidadeProduto(produto.IdProduto, quantidade, connection);
                    CreateVendaProduto(vendaProd, connection);
                }

                transaction.Commit();
                connection.Close();
            }
            catch (Exception)
            {
                transaction.Rollback();
                connection.Close();
                throw;
            }
        }
    }
}
